/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.mecca.modelo;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.http.HttpServlet;
import javax.sql.DataSource;

/**
 * Clase para conectarcon la base de datos y todoslos metodos para devolver
 * datos ya sea en listas o como un unico dato
 * 
 * @author x
 * 
 */
public class Conexion extends HttpServlet {
	private static final long serialVersionUID = -6908799615640922361L;
	private Connection conector;
	/**
	 * Variable que contendra los mensajes de exito a mostrar al suario final
	 */
	protected String successMessage = "";
	/**
	 * Variable que contendra los mensajes de error a mostrar al suario final
	 */
	protected String errorMessage = "";
	/**
	 * Variable que contendra la pleca utilizada por el sistema
	 */
	private String pleca = (System.getProperty("file.separator").equals("/")) ? "/"
			: "\\";

	/**
	 * Metodo constructor que inicializa la conexion a la base de datos
	 * 
	 * @author - Angela
	 * @version - 1.0
	 */
	public Conexion() {
		try {
			Context context = (Context) new InitialContext()
					.lookup("java:comp/env");
			DataSource dataSource = (DataSource) context.lookup("jdbc/mysql");
			setConector(dataSource.getConnection());
			context.close();
		} catch (Exception ex) {
			System.out.println("Error en el construtor Conexion " + ex.getMessage());
		}
	}

	/**
	 * Metodo para obtener una lista de resultados sql
	 * 
	 * @author - Angela
	 * @param sqlQuery
	 * @return ResultSet
	 * @throws SQLException
	 */
	protected ResultSet executeQueryList(String sqlQuery) throws SQLException {
		return getConector().createStatement().executeQuery(sqlQuery);
	}

	/**
	 * Metodo que obtiene un unico resultado sql
	 * 
	 * @author - Angela
	 * @param sqlQuery
	 * @return ResultSet
	 * @throws SQLException
	 */
	protected ResultSet executeQuery(String sqlQuery) throws SQLException {
		return getConector().createStatement().executeQuery(sqlQuery);
	}

	/**
	 * Metodo para insertar datos en la entidad declarada
	 * 
	 * @author - Angela
	 * @param sqlQuery
	 *            - Objeto de tipo String
	 * @return Integer - retorna el id del nuevo registro
	 * @throws SQLException
	 */
	protected Integer save(String sqlQuery) throws SQLException {
		Statement s = getConector().createStatement();
		s.executeUpdate(sqlQuery, Statement.RETURN_GENERATED_KEYS);
		ResultSet r = s.getGeneratedKeys();
		r.next();
		return r.getInt(1);
	}

	/**
	 * Metodo para borrar datos en la entidad declarada
	 * 
	 * @author - Angela
	 * @param sqlQuery
	 *            - Objeto de tipo String
	 * @throws SQLException
	 */
	protected void delete(String sqlQuery) throws SQLException {
		getConector().createStatement().executeUpdate(sqlQuery);
	}

	/**
	 * Metodo para actualizar datos en la entidad declarada
	 * 
	 * @author - Angela
	 * @param sqlQuery
	 *            - Objeto de tipo String
	 * @throws SQLException
	 */
	protected void update(String sqlQuery) throws SQLException {
		getConector().createStatement().executeUpdate(sqlQuery);
	}

	/**
	 * Metodo para obtener la ruta real de la carpeta definida
	 * 
	 * @author - Angela
	 * @param dir
	 *            - Objeto de tipo String
	 * @return String - retorna la direccion de la ruta absoluta
	 */
	protected String getDireccion(String dir) {
		return this.getServletContext().getRealPath(
				dir.replace("/", getPleca()).replace("\\", getPleca()));
	}

	/**
	 * @return the conector
	 */
	private Connection getConector() {
		return conector;
	}

	/**
	 * @param conector
	 *            the conector to set
	 */
	private void setConector(Connection conector) {
		this.conector = conector;
	}

	/**
	 * @return the successMessage
	 */
	public String getSuccessMessage() {
		return successMessage;
	}

	/**
	 * @param successMessage
	 *            the successMessage to set
	 */
	public void setSuccessMessage(String successMessage) {
		this.successMessage = successMessage;
	}

	/**
	 * @return the errorMessage
	 */
	public String getErrorMessage() {
		return errorMessage;
	}

	/**
	 * @param errorMessage
	 *            the errorMessage to set
	 */
	public void setErrorMessage(String errorMessage) {
		this.errorMessage = errorMessage;
	}

	/**
	 * @return the pleca
	 */
	public String getPleca() {
		return pleca;
	}

	/**
	 * @param pleca
	 *            the pleca to set
	 */
	public void setPleca(String pleca) {
		this.pleca = pleca;
	}
}